package com.xunyji.xunyjitest.comm.util.weixin;

import com.xunyji.xunyjitest.config.weixin.WeixinBaseConfig;
import com.xunyji.xunyjitest.model.weixin.param.ConnectParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.security.MessageDigest;
import java.util.Arrays;

/**
 * @author AltEnter
 * @create 2019-01-08 22:45
 * @desc 接入验证工具类
 **/
@Component
public class CheckUtil {

    @Autowired
    private WeixinBaseConfig weixinBaseConfig;

    /**
     * 检验签名
     * @param connectParam 接入请求参数实体类
     * @return
     */
    public boolean checkSignature(ConnectParam connectParam) {
        // 00 将token、timestamp、nonce三个参数放到一个数组中
        String[] arr = new String[] {
                weixinBaseConfig.getToken(), connectParam.getTimestamp(), connectParam.getNonce()
        };
        // 01 排序
        Arrays.sort(arr);
        // 02 三个参数字符串拼接成一个字符串
        StringBuffer content = new StringBuffer();
        for (Integer i = 0; i < arr.length; i++) {
            content.append(arr[i]);
        }

        // 03 进行sha1加密
        String temp = getSha1(content.toString());
        // 04 开发者获得加密后的字符串可与signature对比
        return temp.equals(connectParam.getSignature());
    }

    /**
     * 加密方法
     * @param str 待加密字符串
     * @return
     */
    public static String getSha1(String str) {
        char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
                'a', 'b', 'c', 'd', 'e', 'f' };
        try {
            MessageDigest mdTemp = MessageDigest.getInstance("SHA1");
            mdTemp.update(str.getBytes("UTF-8"));
            byte[] md = mdTemp.digest();
            int j = md.length;
            char buf[] = new char[j * 2];
            int k = 0;
            for (int i = 0; i < j; i++) {
                byte byte0 = md[i];
                buf[k++] = hexDigits[byte0 >>> 4 & 0xf];
                buf[k++] = hexDigits[byte0 & 0xf];
            }
            return new String(buf);
        } catch (Exception e) {
            return null;
        }
    }
}

